/**
 * Deepseek模型请求/响应解析规则插件模板
 * 兼容ModelProcessorPlugin基类规范
 *
 * 【插件开发规范】
 * 1. 插件必须导出一个class，class名称建议与文件名一致。
 * 2. 必须实现 getRequestParseRule(rawRequest) 和 getResponseParseRule(rawResponse) 方法。
 * 3. 若插件需要自定义请求（如API签名、特殊协议），可实现 async makeRequest(rawRequest, callback) 方法（full模式）。
 * 4. 若插件遇到API错误（如返回error字段、HTTP异常），必须主动调用 callback(new Error(...), null)。
 *    - 这样主程序才能捕获并弹窗，便于排查问题。
 *    - 切勿只打印日志或吞掉异常。
 * 5. getRequestParseRule 返回的对象结构需与目标API一致。
 * 6. getResponseParseRule 返回的对象结构需包含 content、done、completed 字段。
 * 7. 插件可通过 this.httpClient 访问主程序注入的 httpClient（如需自定义请求）。
 * 8. 插件开发完成后，建议多测试异常场景，确保错误能被准确弹窗。
 */

module.exports = class RequestParserPlugin {
  constructor(options = {}) {
    this.name = 'RequestParserPlugin';
    
    // 从沙盒注入的能力中获取 HTTP 客户端
    this.httpClient = options.httpClient;
    
    // 验证必需能力（如果插件需要自定义请求）
    if (options.httpClient && typeof options.httpClient.request !== 'function') {
      console.warn('[DeepSeek] 提供的 httpClient 不符合预期格式');
    }
    
    console.log('[DeepSeek] 插件初始化完成', {
      hasHttpClient: !!this.httpClient,
      mode: 'rule-based'
    });
  }
  
  /**
   * 动态设置 HTTP 客户端（支持向后兼容）
   * @param {Object} httpClient HTTP 客户端实例
   */
  setHttpClient(httpClient) {
    if (httpClient && typeof httpClient.request === 'function') {
      this.httpClient = httpClient;
      console.log('[DeepSeek] HTTP 客户端已更新');
    } else {
      console.warn('[DeepSeek] 无效的 httpClient');
    }
  }

  /**
   * 解析请求参数规则
   * @param {Object} model 原始请求数据
   * @returns {Object} 解析后的请求参数
   */
  getRequestParseRule(rawRequest = {}) {
    console.log('Parsing request rule...', JSON.stringify(rawRequest))
    return {
      model: rawRequest.model_type,
      // 消息数组 (混合常量和变量)
      messages: [{
        role: 'user',  // 常量
        content: rawRequest.content  // 变量
      }],
      // 其他参数 (变量)
      temperature: rawRequest.extra_param?.temperature || 0.7,
      max_tokens: rawRequest.extra_param?.max_tokens || 4096,
      stream: rawRequest.extra_param?.stream || true
    }
  }

  /**
   * 解析响应数据规则
   * @param {Object} rawResponse 原始响应数据
   * @returns {Object} 解析后的响应数据
   */
  getResponseParseRule(rawResponse = {}, callback) {
    console.log('Parsing response rule...', JSON.stringify(rawResponse));
    // 统一响应数据结构
    const data = {
      completed: rawResponse.completed || false,
      content: rawResponse.choices?.[0]?.message?.content ||
        rawResponse.choices?.[0]?.delta?.content ||
        rawResponse.message?.content ||
        '',
      done: rawResponse.done || false,
    };
    if (!data || typeof data !== 'object') {
      // 主动抛出错误并带上关键数据
      callback(new Error('API响应异常: ' + JSON.stringify(data)), null);
      return;
    }
    return data;
  }
}
